/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import connection.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.Categoria;

/**
 * Define as regras de manipulação de dados para o banco de categorias;
 * @author Janio Luiz Antunes
 * @author Marcel Vinicius Kohls
 * @see http://code.google.com/p/sysdesk-java/
 *
 */
public class DAOCategoria {
    private final String SQL_ORDER = " ORDER BY cat_descricao";
    private final String SQL_LISTA_CATEGORIAS = "SELECT cat_codigo, cat_descricao FROM categorias WHERE cat_excluido=false";
    private final String SQL_BUSCA_POR_CODIGO = "SELECT * FROM categorias WHERE cat_codigo = ?";
    private final String SQL_ALTERAR = "UPDATE categorias set cat_descricao=? WHERE cat_codigo = ?";
    private final String SQL_INCLUIR = "INSERT INTO categorias (cat_descricao, cat_excluido) VALUES (?,false)";
    private final String SQL_EXCLUIR = "UPDATE categorias set cat_excluido=true WHERE cat_codigo=?";

    /**
     * Retorna um resultSet com o resultado do comando de sql da lista das categorias
     * @return
     * @throws Exception
     */
    public ResultSet getListaCategorias(String pNomeCategoria) throws Exception {

        String sqlNomeCategoria = " ";

        //prepara filtro categoria se desejar
       if (pNomeCategoria != null && pNomeCategoria != "null" && pNomeCategoria.trim().length() > 0) {
           sqlNomeCategoria = " AND cat_descricao LIKE \'"+pNomeCategoria+"%\'";
           System.out.println(SQL_LISTA_CATEGORIAS+sqlNomeCategoria+SQL_ORDER);
       }

        try {
            return Conexao.getStatement().executeQuery(SQL_LISTA_CATEGORIAS+sqlNomeCategoria+SQL_ORDER);
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * retorna uma instancia de categoria a partir de uma busca no sql
     * pelo código passado como parametro.
     * @param pCodCliente
     * @return
     * @throws Exception
     */
    public Categoria getCategoriaPorCodigo(int pCodCategoria) throws Exception {
        PreparedStatement sqlQuery = null;
        ResultSet sqlResult = null;
        Categoria resultadoCategoria = new Categoria();

        try {
            sqlQuery  = Conexao.getConnection().prepareStatement(SQL_BUSCA_POR_CODIGO);
            sqlQuery.setInt(1,  pCodCategoria );
            System.out.println( sqlQuery.toString() );
            sqlResult = sqlQuery.executeQuery();

            resultadoCategoria = getValorDoResultado(sqlResult);

            return resultadoCategoria;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * monta um objeto do tipo categoria, baseado em um retorno de pesquisa de sql em categorias
     * @param pSqlResult
     * @return
     */
    public Categoria getValorDoResultado(ResultSet pSqlResult) throws Exception {
        Categoria objetoRetorno = new Categoria();

        try {

            // apenas define os campos do objeto se realmente retornou resultado
            if (pSqlResult.next()){
                objetoRetorno.setCodigo(pSqlResult.getInt("cat_codigo"));
                objetoRetorno.setDescricao(pSqlResult.getString("cat_descricao"));
                objetoRetorno.setExcluido(pSqlResult.getBoolean("cat_excluido"));
            }

        } catch (Exception e) {
            System.out.println("erro: getValorDoResultado: "+e.getMessage());
        }

        return objetoRetorno;
    }

    /**
     * Salva uma instância de categoria no banco. Se tiver código então é uma alteração,
     * se o código for null, então é inclusão.
     * @param pCategoria
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean salvar(Categoria pCategoria) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pCategoria.getCodigo() != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_ALTERAR);

                sqlQuery.setString(1, pCategoria.getDescricao());
                sqlQuery.setInt(2, pCategoria.getCodigo());

                System.out.println("DAOCategoria.Salvar(Alterar):");
                System.out.println(sqlQuery.toString());
            }
            // prepara SQL para incluir
            else {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_INCLUIR);

                sqlQuery.setString(1, pCategoria.getDescricao());

                System.out.println("DAOCategoria.Salvar(Incluir):");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }

    /**
     * define a flag de excluido de uma categoria.
     * @param pCodigoCategoria
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean excluir(int pCodigoCategoria) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pCodigoCategoria != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_EXCLUIR);

                sqlQuery.setInt(1, pCodigoCategoria);

                System.out.println("DAOCategoria.Excluir:");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }

}
